﻿using IP2Region.Net.XDB;

namespace RuoYi.Framework.Utils;

/// <summary>
/// IP2RegionHelper
/// </summary>
public class IP2RegionHelper
{
    /// <summary>
    /// 每个 ip 数据段的 region 信息都固定了格式：国家|区域|省份|城市|ISP，只有中国的数据绝大部分精确到了城市，其他国家部分数据只能定位到国家，后前的选项全部是0。
    /// 即使是完全基于 xdb 文件的查询，单次查询响应时间在十微秒级别，可通过如下两种方式开启内存加速查询：
    /// vIndex 索引缓存 ：使用固定的 512KiB 的内存空间缓存 vector index 数据，减少一次 IO 磁盘操作，保持平均查询效率稳定在10-20微秒之间。
    /// xdb 整个文件缓存：将整个 xdb 文件全部加载到内存，内存占用等同于 xdb 文件大小，无磁盘 IO 操作，保持微秒级别的查询效率。
    /// </summary>
    /// <param name="ipStr"></param>
    /// <returns></returns>
    public static string Search(string ipStr)
    {
        var earcher = new Searcher(CachePolicy.Content, "ip2region.xdb");
        var ipAddress = earcher.Search(ipStr);
        if (!string.IsNullOrWhiteSpace(ipAddress))
        {
            if (ipAddress.Contains("内网"))
            {
                ipAddress = "内网";
                return ipAddress;
            }
            ipAddress = ipAddress.Replace("|0", "");
            return ipAddress;
        }
        return ipAddress;
    }
}
